#!/usr/bin/env python3.7

# This example formulates and solves the following simple MIP model:
#  maximize
#        x + y + 2 z
#  subject to
#        x + 2 y + 3 z <= 4
#        x +   y       >= 1
#        x, y, z binary

import gurobipy as gp
from gurobipy import GRB

try:

    # 创建一个模型,gurobipy.Model('模型名')
    m = gp.Model("mip1")

    # 设置参数变量x,y,z，Model.addVar() 一次增加一个变量
    # vtype (可自行选择设置): 决策变量类型，包括GRB.CONTINUOUS， GRB.BINARY， GRB.INTEGER，GRB.SEMICONT，GRB.SEMIINT
    x = m.addVar(lb=-5,ub=5 , vtype='C' , name="x")
    y = m.addVar(lb=-5,ub=5 , vtype='C' , name="y")
    z = m.addVar(lb=-5,ub=5 , vtype='C' , name="z")

    # 设置目标函数 求x+y+2z的最大值,MINIMIZE是求最小值，字母必须全大写
    m.setObjective(x + y + 2 * z, GRB.MAXIMIZE)

    # 添加第一个约数条件c0: x + 2 y + 3 z <= 4
    m.addConstr(x + 2 * y + 3 * z <= 4, "c0")

    # 添加第二个约束条件c1: x + y >= 1
    m.addConstr(x + y >= 1, "c1")

    # 开始求解
    m.optimize()
    '''m.getVars()获取优化结果后的变量的值，返回的变量以集合{}或列表[]显示,然后遍历列表或集合中的变量，将其打印输出'''
    # for v in m.getVars():
    #     print('%s %g' % (v.varName, v.x))

    m.printAttr('x')  #直接替换掉上面的for循环遍历打印，'x'是变量优化后的属性

    print('Obj: %g' % m.objVal)  #objVal：（优化后最优的目标结果值）



except gp.GurobiError as e:
    print('Error code ' + str(e.errno) + ': ' + str(e))

except AttributeError: #属性错误
    print('Encountered an attribute error')
